<?php
namespace Zxf5115\Laravel\Local\Upload\Rules;

use Exception;
use Illuminate\Http\UploadedFile;


/**
 * @author zhangxiaofei [<1326336909@qq.com>]
 * @dateTime 2025-09-08
 *
 * 文件验证类
 */
class FileRule
{
  /**
   * 上传资源文件内容验证方法
   *
   * @param UploadedFile $file 文件对象
   * @param array $allowTypes 允许上传的文件类型
   * @return void
   */
  public static function verifyFileData(UploadedFile $file, array $allowTypes = []) : void
  {
    // 上传资源文件是否为空验证
    self::verifyFileExists($file);

    // 上传资源文件有效性验证
    self::verifyFileValid($file);

    // 上传资源文件大小验证
    self::verifyFileSize($file);

    // 上传资源文件类型验证
    self::verifyFileExtension($file, $allowTypes);
  }


  /**
   * 上传资源文件是否为空验证方法
   *
   * @param UploadedFile $file 文件对象
   * @return void
   */
  public static function verifyFileExists(UploadedFile $file) : void
  {
    // 验证文件是否存在
    if(empty($file))
    {
      throw new Exception(__('upload.file_not_found'));
    }
  }


  /**
   * 上传资源文件有效性验证方法
   *
   * @param UploadedFile $file 文件对象
   * @return void
   */
  protected static function verifyFileValid(UploadedFile $file) : void
  {
    // 验证失败
    if(!$file->isValid())
    {
      throw new Exception(__('upload.file_invalid'));
    }
  }


  /**
   * 上传资源文件大小验证方法
   *
   * @param UploadedFile $file 文件对象
   * @return void
   */
  protected static function verifyFileSize(UploadedFile $file) : void
  {
    // 获取文件大小
    $filesize = $file->getSize();

    // 检查文件大小
    if ($filesize > config('upload.max_size') * 1024)
    {
      throw new Exception(__('upload.file_too_large',[
        'size' => config('upload.max_size')
      ]));
    }
  }


  /**
   * 上传资源文件类型验证方法
   *
   * @param UploadedFile $file 文件对象
   * @param array $allowTypes 允许上传的文件类型
   * @return void
   */
  protected static function verifyFileExtension(UploadedFile $file, array $allowTypes = []) : void
  {
    // 获取文件后缀
    $extension = strtolower($file->getClientOriginalExtension());

    // 只能上传规定类型
    if(!empty($allowTypes) && !in_array($extension, $allowTypes))
    {
      throw new Exception(__('upload.invalid_file_type', [
        'types' => implode(', ', $allowTypes)
      ]));
    }
  }
}
